#include "NotificadorDeCambios.h"
#include "JugadorServerImp.h"
#include "UpdateTerritorio.h"
#include "UpdateJugador.h"
#include "UpdateEstado.h"
#include "UpdateTurno.h"
#include <sstream>
#include <iostream>

NotificadorDeCambios::NotificadorDeCambios()
{
	enJuego = false;
	turno  = "";
	estado = "";
}

void NotificadorDeCambios::setJuego(JuegoServerImp* juego) {
	this->juego = juego;
}
void NotificadorDeCambios::setServer(Server* server) {
	this->server = server;
}

void NotificadorDeCambios::update(Observable* observable) {
	if (dynamic_cast<Territorio*>(observable) != 0)
		updateTerritorio(dynamic_cast<Territorio*>(observable));
	else if (dynamic_cast<JugadorServerImp*>(observable) != 0)
		updateJugador(dynamic_cast<JugadorServerImp*>(observable));
	else if (dynamic_cast<JuegoServerImp*>(observable) != 0)
			updateJuego(dynamic_cast<JuegoServerImp*>(observable));
}

void NotificadorDeCambios::updateTerritorio(Territorio* unTerritorio) {
	/*LOS UPDATES DE TERRITORIOS SOLO LOS DEBO MANDAR CUANDO EL JUEGO SE ENCUENTRA EN EL 
	 * ESTADO DE REALIZACION DE PARTIDA*/
	if (juego->getEstado() != juego->getEstadoDeEsperaJugadores()) {
		UpdateTerritorio mensaje(unTerritorio);
		server->broadcast(mensaje);
	}
}

void NotificadorDeCambios::updateJugador(Jugador* unJugador) {
	UpdateJugador mensaje(unJugador);
	server->enviarMensaje(unJugador,mensaje);
}

void NotificadorDeCambios::updateJuego(JuegoServerImp* unJuego) {
	if (enJuego) {
		if (unJuego->getJugadorEnTurno()->getColor() != this->turno) {
			this->turno = unJuego->getJugadorEnTurno()->getColor();
			UpdateTurno mensaje(unJuego->getJugadorEnTurno());
			server->broadcast(mensaje);
		}
	}
	if (juego->getEstado() != juego->getEstadoDeEsperaJugadores())
		enJuego = true;
	if (unJuego->getEstado()->toString() != this->estado) {
		this->estado = unJuego->getEstado()->toString();
		UpdateEstado update(unJuego);
		server->broadcast(update);
	}
}

NotificadorDeCambios::~NotificadorDeCambios()
{
}
